bs(TSh,Etqh,Etq,Programah,Programa) --> 
        [inicio],
                listaSent(TSh,Etqh,Etq,Programah,Programa),
        [fin].

listaSent(TSh,Etqh,Etq,Programah,Programa) --> 
        instruccion(TSh,Etqh,Etq1,Programah,Programa1),
        listaSent(TSh,Etq1,Etq,Programa1,Programa).

listaSent(TSh,Etqh,Etq,Programah,Programa) --> 
        instruccion(TSh,Etqh,Etq,Programah,Programa).

instruccion(TSh,Etqh,Etq,Programah,Programa) -->
        iAsig(TSh,Etqh,Etq,Programah,Programa),[';'].

instruccion(TSh,Etqh,Etq,Programah,Programa) -->
        iSi(TSh,Etqh,Etq,Programah,Programa).

instruccion(TSh,Etqh,Etq,Programah,Programa) -->
        iMientras(TSh,Etqh,Etq,Programah,Programa).

instruccion(TSh,Etqh,Etq,Programah,Programa) -->
        bs(TSh,Etqh,Etq,Programah,Programa).

iAsig(TSh,Etqh,Etq,Programah,Programa) -->
        descriptor(TSh,Etqh,Etq1,Programah,Programa1,_),
        [:=],!,
        exprY(TSh,Etq1,Etq2,Programa1,Programa2),
        {codifica(_,Etq2,Etq,Programa2,Programa,asig,_),!}.

iSi(TSh,Etqh,Etq,Programah,Programa) -->
        [si],
        expresionRel(TSh,Etqh,Etq1,Programah,Programa1),
        {codifica(_,Etq1,Etqirf,Programa1,Programairf,si,EtqSino)},
        [entonces],
        instruccion(TSh,Etqirf,Etq2,Programairf,Programa2),
        restoSi(TSh,Etq2,Etq,Programa2,Programa,EtqSino).

restoSi(TSh,Etqh,Etq,Programah,Programa,EtqSino) -->
        [sino],
        {codifica(_,Etqh,EtqSino,Programah,Programa1,sino,Etq)},
        instruccion(TSh,EtqSino,Etq,Programa1,Programa).

restoSi(_TSh,Etqh,Etqh,Programah,Programah,Etqh) -->
        [].

iMientras(TSh,Etqh,Etq,Programah,Programa) -->
        [mientras],
        expresionRel(TSh,Etqh,Etq1,Programah,Programa1),
        {codifica(_,Etq1,Etq2,Programa1,Programa2,mientras,Etq)},
        [haz],
        instruccion(TSh,Etq2,Etq3,Programa2,Programa3),
        {codifica(_,Etq3,Etq,Programa3,Programa,finMientras,Etqh)}.

